//
//  reader.cpp
//  LOG2810
//
//  Created by Jules Thuillier on 01/03/2014.
//  Copyright (c) 2014 Jules Thuillier. All rights reserved.
//

#include <fstream>
#include <vector>
#include <iostream>
#include <iterator>
#include <string>
#include <regex>
#include <list>
#include <set>
#include <map>

#include "reader.h"



// Constructeurs

reader::reader(){
  directory="";
    empty=1;
    
}

reader::reader(string directory){
    this->directory=directory;
    empty=1;
}

reader::~reader(){
    matrix.clear();
}


// Méthodes


void reader::read(){
    ifstream myfile = select_file();
    analyse(myfile);
    empty=0;
}

vector <vector <int> > reader::get_matrix(){
    return matrix;
}

bool reader::is_empty(){
    return empty;
}


// RF1

ifstream reader::select_file() {
    
    string chemin;
    ifstream file;
    // Si l'ouverture est un échec, on demande à nouveau le chemin vers le fichier
	// chemin absolu "C:\..."
     cin.clear();
    cin.ignore();
    do{
        cout << "Veuillez entrer le chemin vers votre fichier" <<endl;
        getline(cin, chemin);
        directory = chemin;
        
        // tentative d'ouverture du fichier
        file.open(directory);
    } while (!file.is_open());

    // Ferme le flux de lecture du fichier
	file.close();
    
    return file;
}


void reader::analyse(ifstream& file){
    
    file.open(directory);
    
    // Variable temporaire contenant la ligne courante du fichier
     string sortie;
    
    // Expression régulière pour vérifer qu'il s'agit d'une ligne de la matrice
    std::regex matrix_rx("^[0-9]+([^A-Za-z0-9]*[0-9]+)+");
    
    // Expression régulière pour les nombres da la matrice
    std::regex matrix_value_rx("[0-9]+");

    // Lecture du fichier ligne à ligne du début à la fin
    while(!file.eof()){
        
        std::getline(file,sortie);
        
        
        // Si on trouve une ligne de la matrice, on remplit la matrice
        if(regex_match(sortie.begin(), sortie.end(), matrix_rx)){
           
            // Crée un itérateur sur une expression régulière
            auto values_begin = std::sregex_iterator(sortie.begin(), sortie.end(), matrix_value_rx);
            auto values_end = std::sregex_iterator();
            
            // Ajoute les valeurs de chaque composante de la ligne dans un vecteur temporaire
            vector <int> ligne;
            for (std::sregex_iterator i = values_begin; i != values_end; ++i) {
                std::smatch match = *i;
                std::string match_str = match.str();
                
                // Conversion de string a int
                int value = atoi(match_str.c_str());
                // Ajout au vecteur temporaire
                ligne.push_back(value);
            }
            // Ajoute le vecteur a la matrice
            matrix.push_back(ligne);
        }

    }
    // Ferme le flux de lecture du fichier
	file.close();
}

